package com.atguigu.gulimall.order;

import com.alibaba.cloud.seata.GlobalTransactionAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 使用RabbitMQ
 * 1、引入amqp场景启动器：RabbitAutoConfiguration就会自动生效
 * 2、配置消息rabbitmq 的属性
 * 3、给容器自动配置了：CachingConnectionFactory、RabbitTemplate、AmqpAdmin、MessagingTemplateConfiguration
 * <p>
 * RabbitTemplate默然的转换器private MessageConverter messageConverter = new SimpleMessageConverter();
 * 4、@EnableRabbit（如果只是穿件exchange、binding、queue、发送消息，这注解不开启也没事，但是如果使用spring提供的监听消息注解必须开启这个注解）
 * 5、监听消息：使用@RabbitListener,@RabbitHandler；必须有@EnableRabbit；
 *
 * @RabbitListener: 类 + 方法（绑定消息，也可以直接放在方法上接受消息）
 * @RabbitHandler：方法（重载区分不同的消息）
 * 本地事务失效问题
 * 同一个对象内事务方法互调失效。原因：绕过了动态代理对象，事务使用代理对象来控制的
 * 解决：使用代理对象来调用事务方法
 * 1、引入spring-boot-starter-aop；这个场景启动器引入了aspectjweaver
 * 2、@EnableAspectJAutoProxy(exposeProxy = true);开启aspectj 动态代理功能。以后所有的动态代理都是aspectj创建的（即使没有接口也可以创建动态代理对象）
 * exposeProxy = true 对外暴露代理对象
 * 3、本类方法互调，获取到本代理对象的方法
 * OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();
 * orderService.b();
 */
@SpringBootApplication(exclude = GlobalTransactionAutoConfiguration.class)
@EnableFeignClients(basePackages = {"com.atguigu.gulimall.order.feign"})
@EnableDiscoveryClient
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableRedisHttpSession
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
